package org.smile.db.sql;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.smile.util.ObjectLenUtils;
import org.smile.util.RegExp;
/**
 * 参数解析
 * @author 胡真山
 *
 */
public class ParamParser {
	/**
	 * 解析之后的sql语句
	 */
	String sql;
	/**
	 * 解析之后的参数
	 */
	Object[] params;
	
	public Object[] getParams() {
		return params;
	}
	public String getSql() {
		return this.sql;
	}
	/**
	 * 使用自定义名称做为参数
	 * @param oldsql
	 * @throws SQLException 
	 * @paramSQLParams oldparams
	 */
	public ParamParser(String oldsql,Map oldparams) throws SQLException{
		
		if(!(oldsql==null||oldparams==null)){
			RegExp reg=new RegExp(":[a-zA-Z0-9_]+ +|:[a-zA-Z0-9_]+$|:[a-zA-Z0-9_]+,|:[a-zA-Z0-9_]+\\)");
			RegExp endReg=new RegExp("[,| |$|\\)]+");
			String[] regStrs=reg.find(oldsql);
			String tempParam;
			sql=oldsql;
			if(regStrs!=null){
				List list=new ArrayList();
				for(int i=0;i<regStrs.length;i++){
					tempParam=endReg.replaceAll(regStrs[i], "");
					//当值参数的值
					Object param=oldparams.get(tempParam.substring(1,tempParam.length()));
					if(ObjectLenUtils.hashLength(param)){
						int len=ObjectLenUtils.len(param);
						StringBuffer sb=new StringBuffer();
						for(int j=0;j<len;j++){
							sb.append(" ? ");
							if(j<len-1){
								sb.append(",");
							}
							list.add(ObjectLenUtils.get(param,j));
						}
						sql=sql.replaceAll(tempParam,sb.toString());
					}else{
						sql=sql.replaceAll(tempParam," ? ");
						list.add(param);
					}
				}
				params=list.toArray();
			}else{
				Set keySet=oldparams.keySet();
				params=new Object[keySet.size()];
				int i=0;
				for(Iterator iterator=keySet.iterator();iterator.hasNext();i++){
					params[i]=oldparams.get(iterator.next());
				}
			}
		}
	}
	/**
	 * 构造方法
	 * @param sql
	 * @param params
	 */
	public ParamParser(String sql,Object[] params){
		this.sql=sql;
		this.params=params;
	}
}
